/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import ComponenteDatos.BusFacadeLocal;
import ComponenteEntidad.Bus;
import ComponenteEntidad.Disenio;
import ComponenteEntidad.Marca;
import ComponenteEntidad.Modelo;
import ComponenteEntidad.Tipocombustible;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

/**
 *
 * @author ANTHONY
 */
@ManagedBean
@SessionScoped
public class ManagedBeanBus implements Serializable {

    @EJB
    private BusFacadeLocal busFacade;
    private Bus objtetoBus;
    private Bus objtetoBusEditar;
    private Bus objtetoBusCrear;
    private List<Bus> lista;
    private Marca objetoMarca;
    private Modelo objetoModelo;
    private Disenio objetoDisenio;
    private Tipocombustible objetoTipoCombustible;
    private static final int BUFFER_SIZE = 100000000;
    private List<SelectItem> objetoItems = new LinkedList<SelectItem>();
    private HashMap<Integer, Bus> myobjeto = new HashMap<Integer, Bus>();
    private String rutaeditar = "";

    public ManagedBeanBus() {
        objtetoBus = new Bus();
        objtetoBusCrear = new Bus();
        objtetoBusCrear.setBusSSHH(true);
        lista = new LinkedList<Bus>();
        objetoMarca = new Marca();
        objetoModelo = new Modelo();
        objetoTipoCombustible = new Tipocombustible();
        objetoDisenio = new Disenio();
        objtetoBusEditar = new Bus();
    }

    public Bus getObjtetoBusEditar() {
        return objtetoBusEditar;
    }

    public void setObjtetoBusEditar(Bus objtetoBusEditar) {
        this.objtetoBusEditar = objtetoBusEditar;
    }

    public Disenio getObjetoDisenio() {
        return objetoDisenio;
    }

    public void setObjetoDisenio(Disenio objetoDisenio) {
        this.objetoDisenio = objetoDisenio;
    }

    public Modelo getObjetoModelo() {
        return objetoModelo;
    }

    public void setObjetoModelo(Modelo objetoModelo) {
        this.objetoModelo = objetoModelo;
    }

    public Tipocombustible getObjetoTipoCombustible() {
        return objetoTipoCombustible;
    }

    public void setObjetoTipoCombustible(Tipocombustible objetoTipoCombustible) {
        this.objetoTipoCombustible = objetoTipoCombustible;
    }

    public Marca getObjetoMarca() {
        return objetoMarca;
    }

    public void setObjetoMarca(Marca objetoMarca) {
        this.objetoMarca = objetoMarca;
    }

    public Bus getObjtetoBus() {
        return objtetoBus;
    }

    public Bus getObjtetoBus(int id) {
        return (Bus) myobjeto.get(id);
    }

    public void setObjtetoBus(Bus objtetoBus) {
        this.objtetoBus = objtetoBus;
    }

    public Bus getObjtetoBusCrear() {
        return objtetoBusCrear;
    }

    public void setObjtetoBusCrear(Bus objtetoBusCrear) {
        this.objtetoBusCrear = objtetoBusCrear;
    }

    public List<Bus> getLista() {
        try {

            lista = new LinkedList<Bus>();
            List<Bus> listaTemporal = new LinkedList<Bus>();
            listaTemporal = busFacade.findAll();
            for (int i = listaTemporal.size() - 1; i >= 0; i--) {
                if (listaTemporal.get(i).getBusEstado() == true) {
                    lista.add(listaTemporal.get(i));
                }
            }
            if(lista.size()>0){
                objtetoBus=lista.get(lista.size()-1);
            }
            return lista;


        } catch (Exception e) {
            e.printStackTrace();
        }

        return lista;
    }

    public List<SelectItem> getObjetoItems() {
        lista = new ArrayList<Bus>();
        objetoItems = new LinkedList<SelectItem>();
        lista = busFacade.findAll();
        for (Bus p : lista) {
            if (p.getBusEstado() == true) {
                myobjeto.put(p.getIdbus(), p);
                // aqui agrgamos los parametros que sale en el filtro
                objetoItems.add(new SelectItem(p, p.getMarca().getMarMarca() + " " + p.getModelo().getModModelo() + " " + p.getBusAnioFabricacion()));
            }
        }
        return objetoItems;
    }

    public void setObjetoItems(List<SelectItem> objetoItems) {
        this.objetoItems = objetoItems;
    }

    public HashMap<Integer, Bus> getMyobjeto() {
        return myobjeto;
    }

    public void setMyobjeto(HashMap<Integer, Bus> myobjeto) {
        this.myobjeto = myobjeto;
    }

    public void setLista(List<Bus> lista) {
        this.lista = lista;
    }

    public void insertar() {
        try {
            // System.out.println("Entro");
            /*
             ESTAMOS VERIFICANDO SI EXISTE ESTE MODELO.
             */
            //  if (!verificarSiexiste(objetoModelo.getModDescripcion())) {
            objtetoBusCrear.setBusEstado(true);
            // debe existir
            objtetoBusCrear.setDisenio(objetoDisenio);
            // objtetoBusCrear.setBusRutaImagen("ASIGNAR SISTEMA");

            objtetoBusCrear.setMarca(objetoMarca);
            objtetoBusCrear.setModelo(objetoModelo);
            objtetoBusCrear.setTipocombustible(objetoTipoCombustible);

            // System.out.println("AntesCrear");
            busFacade.create(objtetoBusCrear);
            // System.out.println("DespuesCrear");
            objtetoBusCrear = new Bus();
            // }else{
            //    FacesMessage msg = new FacesMessage("Informacion", "YA EXISTE ESTE MODELO DE BUS");
            //       FacesContext.getCurrentInstance().addMessage(null, msg);
            //    }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Bus Seleccionado", ((Bus) event.getObject()).getIdbus().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Bus No seleccionado", ((Bus) event.getObject()).getIdbus().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public boolean verificarSiexiste(String desc) {
        // estamos verificando si existe ese MODELO de BUS.
        boolean existe = false;
        lista = new LinkedList<Bus>();
        List<Bus> listaTemporal = new LinkedList<Bus>();
        listaTemporal = busFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getModelo().getModDescripcion().equalsIgnoreCase(desc) && listaTemporal.get(i).getBusEstado() == true) {
                existe = true;
            }
        }

        return existe;
    }

    public void handleFileUpload(FileUploadEvent event) {
        //// System.out.println("evento" +event);
        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        Date datos = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("ddMMyyyymmss");
        StringBuilder cadena = new StringBuilder(formato.format(datos));
        File result = new File(extContext.getRealPath("//imgBuses") + "//BUS" + cadena.toString() + event.getFile().getFileName().trim().replaceAll(" ", ""));

        try {
            FileOutputStream fileOutputStream = new FileOutputStream(result);
            byte[] buffer = new byte[BUFFER_SIZE];
            int bulk;
            InputStream inputStream = event.getFile().getInputstream();
            while (true) {
                bulk = inputStream.read(buffer);
                if (bulk < 0) {
                    break;
                }

                fileOutputStream.write(buffer, 0, bulk);
                fileOutputStream.flush();
            }
            fileOutputStream.close();
            inputStream.close();
            FacesMessage msg = new FacesMessage("LA IMAGEN : ", event.getFile().getFileName() + " SE SUBIO CON EXITO");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            //   pedido.setRutaFicheroTrabajo(extContext.getRealPath("//WEB-INF//upload") + "/" + event.getFile().getFileName());
            objtetoBusCrear.setBusRutaImagen("imgBuses/BUS" + cadena.toString() + event.getFile().getFileName().trim().replaceAll(" ", ""));
        } catch (IOException e) {
            e.printStackTrace();
            FacesMessage error = new FacesMessage("OCURRIO UN ERROR" + e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
    }

    public void handleFileUploadEditar(FileUploadEvent event) {
        //// System.out.println("evento" +event);
        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        Date datos = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("ddMMyyyymmss");
        StringBuilder cadena = new StringBuilder(formato.format(datos));
        File result = new File(extContext.getRealPath("//imgBuses") + "//BUS" + cadena.toString() + event.getFile().getFileName().trim().replaceAll(" ", ""));

        try {
            FileOutputStream fileOutputStream = new FileOutputStream(result);
            byte[] buffer = new byte[BUFFER_SIZE];
            int bulk;
            InputStream inputStream = event.getFile().getInputstream();
            while (true) {
                bulk = inputStream.read(buffer);
                if (bulk < 0) {
                    break;
                }

                fileOutputStream.write(buffer, 0, bulk);
                fileOutputStream.flush();
            }
            fileOutputStream.close();
            inputStream.close();
            objtetoBus.setBusRutaImagen("imgBuses/BUS" + cadena.toString() + event.getFile().getFileName().trim().replaceAll(" ", ""));
            rutaeditar = objtetoBus.getBusRutaImagen();
            objtetoBusEditar.setBusRutaImagen(rutaeditar);
            // System.out.println("jojojo EDITAR " + objtetoBus.getBusRutaImagen());



        } catch (IOException e) {
            e.printStackTrace();
            FacesMessage error = new FacesMessage("OCURRIO UN ERROR" + e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
    }

    public String getRuta() {
        if (objtetoBusCrear.getBusRutaImagen() == null) {
            return "../images/BUSS.png";
        } else {

            return "../" + objtetoBusCrear.getBusRutaImagen();
        }

    }

    public String getRutaeditar() {
        // System.out.println("rutaaaaa " + objtetoBus.getBusRutaImagen());
        // System.out.println("rutaaaaa yeah " + rutaeditar);
        
        // System.out.println("ULTIMA" + objtetoBusEditar.getBusRutaImagen());
       // if (objtetoBus.getBusRutaImagen() == null) {
      //      return "../images/BUSS.png";
     //   } else {
 
            return "../" + objtetoBusEditar.getBusRutaImagen();
      //  }
    }

    public void editar() {
        try {
            // System.out.println("Entro editar");
            // System.out.println("EDITANDO CON " + rutaeditar);
            objtetoBus.setBusRutaImagen(rutaeditar);
            // System.out.println(objtetoBus.getBusRutaImagen());
            busFacade.edit(objtetoBus);
            objtetoBus.setBusRutaImagen(rutaeditar);
            rutaeditar=null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {
        try {

            objtetoBus.setBusEstado(false);
            busFacade.edit(objtetoBus);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
